** About

Ask =fsbot= on [[http://www.freenode.net/][freenode]] about hell, and it will answer you that =hell is
other people's .emacs=.  This repo is my own hell and I like it very
much.

It is not some elisp code that is pretended to be used by other people
(like [[http://batsov.com/prelude/][prelude]], [[https://github.com/technomancy/emacs-starter-kit/tree/master][emacs-starter-kit]] or even [[https://github.com/kovan/dopemacs][dopemacs]]).  It is *my own*
Emacs config and it is intended to be used only by me.

Anyway here is what makes this hell so warm and comfortable for me.

** Features

- No [[http://orgmode.org/worg/org-contrib/babel/intro.html#literate-programming][Org-mode for emacs config]] because good old =.el= files are much
  more convenient for me.

- Unusable key bindings: I use hundreds and hundreds of non-standard key
  bindings that are suitable for me.  Besides I use dvorak layout, so my
  bindings may look really weird for other people.  I use my code (from
  [[https://github.com/alezost/emacs-config/blob/master/keys.el][keys.el]]) based on [[https://github.com/jwiegley/use-package/blob/master/bind-key.el][bind-key]] to manage those tons of keys.

- I prefer to split my config into several files than to keep everything
  in a single one.  And it is really easy to search them using [[https://github.com/alezost/imenus.el][imenus]].
  I just press =s-s= (which is bound to =al/imenus-search-elisp-dir=
  from [[https://github.com/alezost/emacs-config/blob/master/utils/al-imenus.el][al-imenus.el]]) and jump to =with-eval-after-load= clause or
  perform =isearch= or =occur= if I need to search for something.

- Currently I use [[https://github.com/quelpa/quelpa][quelpa]] to install/upgrade Emacs packages.  I just run
  =al/quelpa= command (with prefix if needed) to install or upgrade some
  package (or all packages).  However I'm going to switch to [[http://www.gnu.org/software/guix/][GNU Guix]]
  for managing the Emacs packages I use (this is a work in progress:
  some of the packages are already handled by Guix, but most are still
  installed using Emacs package system and quelpa).

- My Emacs config is intended to be robust.  I mean it does not require
  any third-party packages to be started successfully.  So I can easily
  deploy my config on a fresh system: I just clone the repo and make
  [[~/.emacs.d/init.el]] file a symlink to my [[https://github.com/alezost/emacs-config/blob/master/init/init.el][init.el]].  Actually this
  process is even more simple, as I don't do this manually – I use my
  [[https://gitlab.com/alezost-config/config][config]] script to fetch and deploy all my configs including this Emacs
  config.

- And I don't use [[https://github.com/jwiegley/use-package/][use-package]] anymore (see commit 2e49f03).  I used to
  do it until I realized the importance of the previous point.  When you
  use =use-package= in your config, it becomes a required dependency for
  starting Emacs, so on a "fresh" system, you need to install it at
  first, before you can use your config.  Also someday it may be changed
  in a way that will break your system, and you'll have to fix your
  config without using it.

- My Emacs start time is always less than a second according to =M-x
  emacs-init-time= (actually, I have this value in my
  =initial-scratch-message= so I know the init time very well), because
  I don't =require= packages without a reason as some people do.
  Instead I use =with-eval-after-load= everywhere.

** Files

As you can see, this repository consists of the following directories:

- =init=: The files that are loaded on Emacs start.  As described above
  [[file:init/init.el]] is the "main" init file.  It defines some major
  things and then loads the rest files from this directory.

- =utils=: These are my various auxiliary small packages with the
  additional code (for Emacs itself and for external packages) that is
  not needed for start-up.  All of the code there have "al/" prefix and
  are placed in files that provide "al-…" features.  My init files are
  full of things like:

  #+BEGIN_SRC emacs-lisp
  (with-eval-after-load 'eshell
    ;; ...
    (when (require 'al-eshell nil t)
      ;; ...
      ))
  #+END_SRC

  So these utils are loaded only if and when they are needed.  Also
  there are many interactive commands there which are autoloaded (I use
  =al/update-autoloads= command to update these autoloads).

  In the past these utils were placed in a [[https://github.com/alezost/emacs-utils][separate repository]] and had
  "utl-" prefix.

- =data=: Just some Emacs related data (like eshell aliases or my
  yasnippets) that I use.
